<html>
    <head>
        <title>实体缓存  Entity Cache</title>
    </head>
    <body>
        <script>
            // 实体缓存 

                    /*
                        ABP 提供了一个实体缓存系统，它工作在"分布式缓存系统"之上。
                    
                        它代替你执行以下操作：

                            ①、在第一次调用从数据库中获取实体 (通过使用存储库)，然后再后续调用中从缓存中获取它。

                            ②、如果实体被更新或删除，则自动使缓存的实体无效。因此，它将在下一次调用中从数据库中检索并被重新缓存。
                    */

                    /*
                        一、缓存实体对象

                                IEntityCache<TEntityCacheItem,Tkey> 是ABP为缓存实体提供的简单服务。假设你有一个Product实体，如下所示：

                                        public class Product : AggregateRoot<Guid>
                                        {
                                            public string Name { get; set; }
                                            public string Description { get; set; }
                                            public float Price { get; set; }
                                            public int StockCount { get; set; }
                                        }

                                如果要缓存此实体，应首先配置依赖注入系统以在模块类的 ConfigureServices 方法中注册 IEntityCache服务：

                                        context.Services.AddEntityCache<Product,Guid>()  // 实体缓存系统将执行对象映射

                                由于实体缓存系统将执行"对象映射"（从 Product 到 ProductDto）,我们应该配置对象映射。  这里使用AutoMapper 来完成映射：

                                        public class MyMapperProfile : Profile
                                        {
                                            public MyMapperProfile()
                                            {
                                                CreateMap<Product, ProductDto>();
                                            }
                                        }

                                现在，你可以在任何需要的地方注入 IEntityCache<Product,Guid> 服务：

                                        public class ProductAppService : ApplicationService, IProductAppService
                                        {
                                            private readonly IEntityCache<ProductDto, Guid> _productCache;

                                            public ProductAppService(IEntityCache<ProductDto, Guid> productCache)
                                            {
                                                _productCache = productCache;
                                            }

                                            public async Task<ProductDto> GetAsync(Guid id)
                                            {
                                                return await _productCache.GetAsync(id);
                                            }
                                        }
                                        
                                请注意， _productCache.GetAsync() 方法已经返回了一个 ProductDto 对象，因此我们可以直接从应用程序服务返回它。

                    */

                    /*
                        二、配置

                                所有 context.Services.AddEntityCache() 方法都获得一个可选的 DistributedCacheEntryOptions 参数，你可以在其中轻松配置缓存选项：

                                        context.Services.AddEntityCache<Product, ProductDto, Guid>(
                                            new DistributedCacheEntryOptions
                                            {
                                                SlidingExpiration = TimeSpan.FromMinutes(30)
                                            }
                                        );

                                        使用AbsoluteExpirationRelativeToNow配置，默认缓存持续时间为2分钟。
                    */

                    /*
                        三、附加说明

                                实体类应该可以序列化/反序列化到/从JSON缓存（因为它在保存在分布式缓存中时被序列化为JSON）。
                                
                                如果你的实体类不可序列化，你可以考虑使用cache-item/DTO类，如前所述。

                                实体缓存系统被设计为只读。如果需要，你应该使用标准的存储库方法来操作实体。
                                
                                如果你需要操作（更新）实体，不要从实体缓存中获取它。相反，从存储库中读取它，更改它并使用存储库进行更新。
                    */
        </script>
    </body>
</html>